package be.kdg.bombermanunlimited.client.gui.startup;

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.AbstractAction;

import be.kdg.bombermanunlimited.client.CentralRegistry;
import be.kdg.bombermanunlimited.client.CentralRegistry.BombermanObjects;

/**
 * De AbstractAction klasse voor de connect knop
 * @author Philip
 *
 */
public class Connect extends AbstractAction {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ClientSettings settings;

	public Connect(String title, ClientSettings settings) {
		super(title);

		this.settings = settings;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// je kan maar 1 keer op de knop drukken
		setEnabled(false);
		
		// variabelen om het ip adres te detecteren, nodig om de node te registreren
		Socket sckt = null;
		String hostIp = "";

		// verander de status
		settings.setState("Connecting to server");
		try {
			// connect met de server
			sckt = new Socket(settings.getHostAddress(),
					settings.getHostPort() + 1);
		} catch (UnknownHostException e1) {
			// host bestaat niet?
			settings.setState("Can't find the host! Check the address and port!");
			setEnabled(true);
			return;
		} catch (IOException e1) {
			// host bestaat niet?
			settings.setState("Can't connect to the host! Check the address and port!");
			setEnabled(true);
			return;
		}

		// als er een connectie is gemaakt
		if (sckt != null) {
			hostIp = sckt.getInetAddress().getHostAddress();
			settings.setState("Getting your ip address");
			byte buff[] = new byte[1024];
			byte inputBuff[] = new byte[0];
			int len = 0;

			// de server gaat je ip-adres doorsturen. Dit is nodig omdat
			// private lans nat gebruiken
			
			// stop while als lin == -1 --> connectie is verbroken door host
			while (len != -1) {
				try {
					len = sckt.getInputStream().read(buff);

					if (len > 0) {
						byte tmp[] = new byte[inputBuff.length + len];
						for (int i = 0; i < inputBuff.length; i++) {
							tmp[i] = inputBuff[i];
						}

						for (int i = 0; i < len; i++) {
							tmp[i + inputBuff.length] = buff[i];
						}

						inputBuff = tmp;
					}
				} catch (IOException e1) {
					len = -1;
					e1.printStackTrace();
				}
			}

			// aflsuiten al dit nog niet gebeurt is
			if (!sckt.isInputShutdown()) {
				try {
					sckt.shutdownInput();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			if (!sckt.isOutputShutdown()) {
				try {
					sckt.shutdownOutput();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			if (!sckt.isClosed()) {
				try {
					sckt.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			// bytes omvormen naar een string
			String ip = new String(inputBuff);
			settings.setState("Your ip: " + ip);

			// registreer alle objecten in het registery
			CentralRegistry reg = CentralRegistry.getRegistry();
			reg.putObject(BombermanObjects.LOCAL_IP, ip);
			reg.putObject(BombermanObjects.RING_PORT, settings.getRingPort());
			reg.putObject(BombermanObjects.HOST_IP, hostIp);
			reg.putObject(BombermanObjects.HOST_PORT, settings.getHostPort());
			reg.putObject(BombermanObjects.USERNAME, settings.getUsername());
			reg.putObject(BombermanObjects.MUSIC_DIRECTORY,
					settings.getMusicFolder());

			// zeg dat het volgende window mag komen.
			settings.nextWindow();
		}
	}

}
